Przykad 7.5. Realizacja algorytmu A*Search
public Solution search(INode initial, INode goal) {
   // Zacznij od stanu pocztkowego
   INodeSet open = StateStorageFactory.create(StateStorageFactory.TREE);
   INode copy = initial.copy();
   scoringFunction.score(copy);
   open.insert(copy);

   // Uyj tablicy z haszowaniem do pamitania stanw ju odwiedzonych
   INodeSet closed = StateStorageFactory.create(StateStorageFactory.HASH);
   while (!open.isEmpty()) {
      // Usu wze z najnisz funkcj oceny i oznacz go jako zamknity
      INode n = open.remove();
      closed.insert(n);

      // Wyjd, jeli osignito stan docelowy
      if (n.equals(goal)) { return new Solution (initial, n); }

      // Oblicz nastpne ruchy i uaktualnij listy otwartych i zamknitych
      DepthTransition trans = (DepthTransition) n.storedData();
      int depth = 1;
      if (trans != null) { depth = trans.depth+1; }
      DoubleLinkedList<IMove> moves = n.validMoves();
      for (Iterator<IMove> it = moves.iterator(); it.hasNext(); ) {
         IMove move = it.next();

         // Wykonaj ruch i oce nowy stan planszy
         INode successor = n.copy();
         move.execute(successor);

         // Zapisz poprzedni ruch w ladzie rozwizania i oblicz
         // funkcj oceniajc, eby sprawdzi, czy poprawilimy
         // sytuacj w stosunku do ju zamknitego stanu
         successor.storedData(new DepthTransition(move, n, depth));
         scoringFunction.score(successor);

         // Jeli ju odwiedzony, sprawd, czy odwiedzamy go z mniejszym
         // kosztem. Jeli nie, to kontynuuj; w przeciwnym razie wyjmij
         // z zamknitych i przetwrz
         INode past = closed.contains(successor);
         if (past != null) {
            if (successor.score() >= past.score()) {
               continue;
            }

            // Odwiedzamy ponownie z naszym mniejszym kosztem
            closed.remove(past);
         }

         // Umie w otwartych
         open.insert(successor);
      }
   }

   // Nie ma rozwizania
   return new Solution (initial, goal, false);
}
